#ifndef  __GPIO_H__
#define  __GPIO_H__

#include "../common/include/stm32mp1xx_gpio.h"
#include "../common/include/stm32mp1xx_rcc.h"
#define  GPIO_PIN_0   0x0001U
#define  GPIO_PIN_1   0x0002U
#define  GPIO_PIN_2   0x0004U
#define  GPIO_PIN_3   0x0008U
#define  GPIO_PIN_4   0x0010U
#define  GPIO_PIN_5   0x0020U
#define  GPIO_PIN_6   0x0040U
#define  GPIO_PIN_7   0x0080U
#define  GPIO_PIN_8   0x0100U
#define  GPIO_PIN_9   0x0200U
#define  GPIO_PIN_10  0x0400U
#define  GPIO_PIN_11  0x0800U
#define  GPIO_PIN_12  0x1000U
#define  GPIO_PIN_13  0x2000U
#define  GPIO_PIN_14  0x4000U
#define  GPIO_PIN_15  0x8000U

typedef enum {
    GPIO_INPUT = 0,
    GPIO_OUTPUT,
    GPIO_AFT,
    GPIO_ANALOG,
} moder_t;

typedef enum {
    GPIO_PP = 0,
    GPIO_OD,
} otyper_t;

typedef enum {
    GPIO_LOW_SPEED = 0,
    GPIO_MEDIUM_SPEED,
    GPIO_HIGH_SPEED,
    GPIO_VERY_HIGH_SPEED,
} ospeedr_t;

typedef enum {
    GPIO_NO_PUPD = 0,
    GPIO_PU,
    GPIO_PD,
} pupdr_t;

typedef enum {
    GPIO_RESET = 0,
    GPIO_SET, 
} gpio_status_t;

typedef struct {
    unsigned int pins; 
    moder_t mode;
    otyper_t type;
    ospeedr_t speed;
    pupdr_t pupd;
} gpio_init_t;
/*
    gpios:哪个组的
    init : gpio引脚初始化的结构体
*/
void hal_gpio_init(gpio_t *gpios, gpio_init_t *init);
/*
    gpios:哪个组的
    pins：哪个gpio引脚
    status:引脚的输出的状态
*/
void hal_gpio_write(gpio_t * gpios, unsigned int pins, gpio_status_t status);
/*
    gpios:哪个组的
    pins：哪个gpio引脚
    
    返回值：引脚的输入的状态
*/
gpio_status_t hal_gpio_read(gpio_t * gpios, unsigned int pins);

#endif  // __GPIO_H__
